package com.agent;

import java.lang.instrument.ClassFileTransformer;
import java.lang.instrument.IllegalClassFormatException;
import java.lang.instrument.Instrumentation;
import java.security.ProtectionDomain;

/**
 * 应用程序添加启动参数：-javaagent:D:\learning\agentDemo\premainAgentDemo2\target\premainAgentDemo2-1.0-SNAPSHOT.jar=hello
 * @author dingrz
 */
public class HelloAgent {

    public static void premain(String agentArgs, Instrumentation inst){
        System.out.println("========进入premain方法,参数="+agentArgs+"=======");
//        inst.addTransformer(new PrintTransformer());
        inst.addTransformer(new MonitorDemoTransformer());
    }

    /**
     * ClassFileTransformer需要注册到Instrumentation实例中才能生效。
     * 获取Instrumentation实例的方法有2种：
     * 　　虚拟机启动时，通过agent class的premain方法获得
     * 　　虚拟机启动后，通过agent class的agentmain方法获得
     */
    static class PrintTransformer implements ClassFileTransformer {

        @Override
        public byte[] transform(ClassLoader loader, String className, Class<?> classBeingRedefined, ProtectionDomain protectionDomain, byte[] classfileBuffer) throws IllegalClassFormatException {
            if(className != null) {
                System.out.println("将要加载类:" + className);
            }
            return classfileBuffer;
        }
    }


}
